package com.srwl.mytx.service;


import com.srwl.mytx.annotation.SerializedField;
import com.srwl.mytx.domain.CommonResult;
import com.srwl.mytx.domain.User;

import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.Query;

/**
 * Created by dahai2070 on 2018/2/1 0001.
 * <p>
 * 如果post 上传多个数据对象，必须打包进 Map，不能是 JSONObject,
 * 如果是单独一个类，可直接上传，
 * 如果请求中只携带token,没有其他数据，把token 放JSONObject中，key为 token,再上传，
 */

public interface UserService {

    /**
     * 注册
     *
     * @param
     * @param
     * @return
     */

    @POST("/user/register")
    Call<CommonResult> register(@Query("mobileCode") String mobileCode, @Body User user);//@Part("avatar\"; filename=\"avatar.jpg") RequestBody avatar,

    // Call<CommonResult> saveAvatar(@PartMap Map<String, RequestBody> params);
    @Multipart
    @POST("/user/saveAvatar")
    Call<CommonResult> saveAvatar(@Part("avatar\"; filename=\"avatar.png") RequestBody avatar, @Query("token") String token);

    /**
     * 登录
     *
     * @return
     */
    @POST("/user/login_v1")
    // @Headers("Encrypt:1")//加上这个header数据是不加密上传
    Call<CommonResult> login(@Body Object body);

    @POST("/user/logout_v1")
    Call<CommonResult> logout(@Body Object body);

    @POST("/user/updateUserInfo")
    Call<CommonResult> updateUserInfo(@Body Object body);

    @POST("/user/modifyPhoneNumber")
    Call<CommonResult> modifyPhoneNumber(@Body Object body);

    @POST("/user/modifyPassword")
    Call<CommonResult> modifyPassword(@Body Object body);


    /**
     * 用于注册发送验证码
     * 该方法会检测 手机号是否启用，是否与某个账户绑定，如果手机号已经被使用，则返回错误
     *
     * @return
     */
    @POST("/user/sendRegisterMobileCode")
    Call<CommonResult> sendMobileCode(@Body String phoneNumber);

    @POST("/user/sendBindingMobileCode")
    Call<CommonResult> sendBindingMobileCode(@Body String phoneNumber);

    /**
     * 用于找回密码等发送验证码
     * 该方法会检测 手机号是否启用，是否与某个账户绑定，如果没有启用，则返回错误，
     *
     * @param phoneNumber
     * @return
     */
    @POST("/user/sendMobileCode_1")
    Call<CommonResult> sendMobileCode_1(@Body String phoneNumber);

    /**
     * 一开始token是放header 里面，这样请求的时候，body为空，如果返回的数据需要用aes加密的话，那服务端就缺少客户端应该传过去的 aesKEY,
     * 并且考虑到，token如果放header,别人很容易就拿到了，虽然稍微重要一些的api,参数都是加密的，里面放了时间戳，就算别人拿到token,和加密后的body,也是没法重复提交请求的，
     * 但是像这个自动登录，如果token,放header,别人拿到了，就能实现自动登录了，目前自动登录成功后，服务端没有返回用户数据，值返回自动登录成功，如果要返回数据的话，
     * 像现在对自动登录返回的数据没加密的话，别人就能拿到数据了，所以，索性把token 不放header,都放body 里面加密再上传，因为加密。所以必须携带 aesKey，
     * 这样服务端要返回数据，也不存在缺少aesKEY了，
     * 如果token还是放header,也可以在body里面只放aesKEY,如果服务端返回的数据需要加密的话，
     * <p>
     * 我在想，如果每次请求都携带token,为何不在RequestBodyConverter里面，添加进token,这样是不行的，如果请求方法里面，body是空的，都不会进入RequestBodyConverter.convert()方法，
     * 所以，如果token.不放header里面，那么就只有做参数，传给api方法，
     *
     * @param
     * @return
     * @Body String token  这样写的话，服务端收到的的token 还带双引号，
     */
    @POST("/user/autoLogin")
    Call<CommonResult> autoLogin(@Body Object body);//@Header("Authorization") String token

    /**
     * 临时登录（游客登录）
     * 后端返回一个默认联系人，用于展示联系人相关的功能
     * 后端收到这个请求，发一条欢迎信息过来
     *
     * @return
     */
    @POST("/user/tempLogin")
    Call<CommonResult> tempLogin(@Body Object body);


    /**
     * 添加联系人：用于接受对方好友邀请的似乎后
     *
     * @return
     */
    @POST("/user/addContact")
    Call<CommonResult> addContact(@Body Object body);

    /**
     * 查找联系人：用于通过手机号搜索联系人
     *
     * @param mobile
     * @return
     */

    @POST("/user/searchContact")
    Call<CommonResult> searchContact(@Body String mobile);

    /**
     * 发送邀请：用于发送好友邀请的时候
     *
     * @return
     */
    @POST("/user/sendInviteMessage")
    Call<CommonResult> sendInviteMessage(@Body Object body);

    @POST("/user/updateContact")
    Call<CommonResult> updateContact(@Body Object body);

    @POST("/user/deleteContact")
    Call<CommonResult> deleteContact(@Body Object body);

    @POST("/user/refuseAddContact")
    Call<CommonResult> refuseAddContact(@Body Object body);

    @POST("/user/location")
    Call<CommonResult> location(@Body Object body);

    @POST("/user/connectInfinite")
    Call<CommonResult> connectInfinite(@Body Object body);

    @POST("/user/refreshConnectInfinite")
    Call<CommonResult> refreshConnectInfinite(@Body Object body);

    @POST("/user/follow")
    Call<CommonResult> follow(@Body Object body);

    @POST("/user/getUserInfo")
    Call<CommonResult> getUserInfo(@Body Object body);

    @POST("/user/getUserInfo_v1")
    Call<CommonResult> getUserInfo_v1(@Body Object body);


    @POST("/user/userBindAccount")
    Call<CommonResult> userBindAccount(@Body Object body);

    /**
     * 即使是get请求，上传数据不加密，也必须添加 @SerializedField(encode = false) 这个注解，因为返回数据是根据这个注解来判断responseBody是否需要解密，默认是需要解密的
     */
    @GET("/user/getVersion")
    @SerializedField(encode = false)
    Call<CommonResult> getVersion();

    @POST("/user/syncUserInfo")
    Call<CommonResult> syncUserInfo(@Body Object body);

    @POST("/user/setPayPassword")
    Call<CommonResult> setPayPassword(@Body Object body);

    /**
     * 修改
     *
     * @param body
     * @return
     */
    @POST("/user/modifyPayPassword")
    Call<CommonResult> modifyPayPassword(@Body Object body);

    @POST("/user/checkPassWord")
    Call<CommonResult> checkPassWord(@Body Object body);

    @POST("/user/replacePayPassword")
    Call<CommonResult> replacePayPassword(@Body Object body);

    @POST("user/setPasswordFreePaymentLimit")
    Call<CommonResult> setPasswordFreePaymentLimit(@Body Object body);

    @SerializedField(encode = false)
    @GET("/user/customerService")
    Call<CommonResult> customerService();

    /**
     * 关注
     *
     * @param body
     * @return
     */
    @POST("/user/addAttention")
    Call<CommonResult> addAttention(@Body Object body);

    /**
     * 取消关注
     *
     * @param body
     * @return
     */
    @POST("/user/removeAttention")
    Call<CommonResult> removeAttention(@Body Object body);


    /**
     * 检查是否关注 获取粉丝关注数
     *
     * @param body
     * @return
     */
    @POST("/user/checkAttention")
    Call<CommonResult> checkAttention(@Body Object body);

    /**
     * 加载关注(粉丝)列表
     *
     * @param body
     * @return
     */
    @POST("/user/loadFollowFansList")
    Call<CommonResult> loadFollowFansList(@Body Object body);

    //上传一些日志数据
    @POST("/user/uploadLogData")
    Call<CommonResult> uploadLogData(@Body Object body);

    @GET("/user/get_service_time")
    Call<CommonResult> getServiceTime();
}
